//
// Created by Jisam on 30/08/2024 8:31 PM.
// Solution of  P3397 地毯
// 2024-08-30 20:47:04 AC 100
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};

// 定义最大数组大小，足以容纳最多10000个元素
const int MAXN = 1e4 + 5;
// ma数组用于记录每个点的累加值变化
int ma[MAXN][MAXN];

/**
 * solution函数用于解决特定的问题
 * 该问题涉及到在一个n x n的矩阵中，根据输入的矩形区域进行累加和操作
 * 参数：n 表示矩阵的大小，m 表示进行的操作次数
 * 返回：无返回值，但会通过标准输出展示最终的矩阵累加和结果
 */
void solution() {
    // n和m分别用于记录矩阵的大小和操作的次数
    int n,m;
    cin >> n >> m;
    // 对于每一次操作，根据输入的矩形区域的两个对角点坐标(a, b)和(c, d)
    // 在相应的区域进行累加值的更新，采用差分数组的思想
    for(int i = 0 ; i <m ; i ++){
        int a,b,c,d;
        cin >> a >> b >> c >>d;
        ++ma[a][b];
        --ma[c + 1][b];
        --ma[a][d + 1];
        ++ma[c + 1][d + 1];
    }
    // 通过二维前缀和的方式，计算出最终每个点的累加值
    // 并输出结果
    for(int i = 1; i <= n; i ++){
        for(int j = 1; j <= n;j ++){
            ma[i][j] += ma[i -1][j] + ma[i][j - 1] - ma[i -1][j - 1];
            cout << ma[i][j] <<" ";
        }
        cout <<endl;
    }
}


int main() {
    code_by_jisam;
    int T = 1;
//    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}